local key = KEYS[1]
local flag = redis.call('EXISTS', key)
if flag == 0 then
    return {err = 'coupon not exists'}
end

local field = "issueEndTime"
-- 获取结束发放时间
local issueEndTimeStr = redis.call('HGET', key, field)
local issueEndTime = tonumber(issueEndTimeStr)
-- 获取当前时间（毫秒）
local currentTime = tonumber(redis.call('TIME')[1]) * 1000
-- 根据当前时间和结束发放时间判断是否在发放期
if currentTime > issueEndTime then
    return {err = "COUPON_NOT_ISSUE"}
end

field = "totalNum"
local totalNumStr = redis.call('HGET', key, field)
local totalNum = tonumber(totalNumStr)
-- 校验库存是否足够
if totalNum <= 0 then
    return {err = "COUPON_NOT_ENOUGH"}
end

local userCouponKey = KEYS[2] -- 用户优惠券的哈希表键
local userId = ARGV[1] -- 当前用户ID
local couponId = ARGV[2] -- 优惠券ID
-- 获取用户已领取的数量
local userCouponField = userId .. "," .. couponId
local countStr = redis.call('HGET', userCouponKey, userCouponField)
local count = countStr and tonumber(countStr) or 0

-- 获取每个用户可以领取的数量
local userLimitStr = redis.call('HGET', key, 'userLimit')
local userLimit = tonumber(userLimitStr)
-- 校验用户是否超领
if count >= userLimit then
    return {err = "COUPON_LIMIT"}
end
-- 获取库存数量
local totalNumStr = redis.call('HGET', key, 'totalNum')
local totalNum = tonumber(totalNumStr)
-- 校验库存是否足够
if totalNum <= 0 then
    return {err = "COUPON_NOT_ENOUGH"}
end
-- 更新用户领取的数量和库存
if count == 0 then
    -- 用户第一次领取
    redis.call('HSET', userCouponKey, userCouponField, 1)
else
    -- 用户非第一次领取，增加领取数量
    redis.call('HSET', userCouponKey, userCouponField, count + 1)
end
redis.call('HSET', key, 'totalNum', totalNum - 1)
return "SUCCESS"